#include"list.h"
#include<list>
namespace Wang
{

void test01()
{
    list<int> ls1 = { 1,2,3,4,5 };
    auto it = ls1.begin();
    auto pos = it++;
    cout << *pos << endl;
    cout << *it << endl;
    *pos = 999;
    *it = 888;
    for(auto e : ls1) cout << e << ' ';
    cout << endl;

    list<char> ls2 = { 'H', 'e', 'l', 'l', 'o' };
    for(auto e : ls2) cout << e << ' ';
    cout << endl;

}

struct Pos
{
    int x;
    int y;
    Pos(int a = 0, int b = 0)
        :x(a)
        ,y(b)
    {}
};
void test02()
{
    list<Pos> ls1;
    for(int i = 1; i < 4; i++) ls1.push_back({i,i});
    auto it = ls1.begin();
    while(it != ls1.end())
    {
        cout << it->x << ' ' << it->y << endl;
        cout << it.operator->()->x << ' ' << it.operator->()->y << endl; 
        // 上面两行代码等价，按理说应该写两个->，但为了提高可读性，就优化掉了
        ++it;
    }
}

void test03()
{
    // Pos p1 = { 1,2 };
    // const Pos* ptr = &p1;
    // cout << ptr->x << endl;
    // // ptr->x = 101;   // err无法修改
    // // int& xx = ptr->x;   // err, 需要加const

    list_node<Pos> hh({3,4});
    const list_node<Pos>* p = &hh;
    // Pos& pos = p->_data;    // err
    const Pos& pos = p->_data;
}

void test04()
{
    const list<int> ls1 = { 1,2,3,4,5 };
    list<int>::const_iterator it = ls1.begin();
    while(it != ls1.end())
    {
        cout << *it << ' ';
        // *it = 999;  // err, 无法修改
        ++it;
    }
    cout << endl;
    
    for(auto e : ls1) cout << e << ' ';
}

void test05()
{
    // list<int> ls1;
    // for(int i = 0; i < 5; i++)
    //     ls1.insert(ls1.end(), i);
    // while(!ls1.empty())
    // {
    //     ls1.erase(ls1.begin());
    //     for(auto e : ls1) cout << e << ' ';
    //     cout << endl;
    // }

    list<int> ls2 = { 1,2,3,4,5 };
    for(int i = 0; i < 5; i++) ls2.push_front(i * 10);
    ls2.print();

    ls2.pop_back();
    ls2.pop_back();
    ls2.pop_front();
    ls2.print();
}

void test06()
{
    list<int> ls1 = { 1,2,3,4,5 };
    list<int> ls2 = ls1;
    ls1.print();
    ls2.print();

    list<int> ls3 = { 6,6,6 };
    ls3.print();
}

void test07()
{
    const list<int> ls1 = { 1,2,3,4,5 };
    // list<int>::const_iterator it = ls1.begin();
    // it != ls1.end();

    // while(it != ls1.end())
    // {
    //     cout << *it << ' ';
    //     it++;
    // }

    auto pos = find(ls1.begin(), ls1.end(), 3);
    cout << *pos << endl;
}
} // namespace Wang


void test()
{
    int* p = new int(0);
    delete p;
    delete p;
}
int main()
{
    // test();
    Wang::test07();
    return 0;
}


// class Test
// {
// public:
//     void print()
//     {
//         cout << "void print()" << endl;
//     }
// };

// void test()
// {
//     // Test& t = Test();
//     const Test& t = Test();
//     // t.print();  // err const成员不可以调用print()

//     Test().print(); // 匿名对象具有常性，但可以调用非const成员函数
// }